﻿#ifndef COMMON_H
#define COMMON_H

#include <wx/wx.h>
#include <wx/dir.h>
#include <wx/icon.h>
#include <wx/filename.h>
#include <wx/stdpaths.h>
#include <wx/log.h>
#include <wx/buffer.h>
#include <wx/mstream.h>
#include <wx/file.h>
#include <wx/ffile.h>
#include <wx/thread.h>
#include <wx/tokenzr.h>
#include <wx/glcanvas.h>
#include <wx/aui/aui.h>
#include <wx/aui/auibook.h>
#include <wx/timer.h>
#include <wx/textctrl.h>
#include <wx/notebook.h>
#include <wx/scrolwin.h>
#include <wx/thread.h>
#include <wx/stc/stc.h>
#include <wx/richtext/richtextctrl.h>
#include <wx/datetime.h>
#include <wx/geometry.h>
#include <wx/filefn.h>
#include <wx/artprov.h>
#include <wx/toolbar.h>
#include <wx/event.h>
#include <wx/geometry.h>
#include <wx/gdicmn.h>
#include <wx/hash.h>
#include <wx/fileconf.h>

#include <memory>

#include "wx/richtext/richtextctrl.h"
#include "wx/richtext/richtextctrl.h"
#include "wx/richtext/richtextstyles.h"
#include "wx/richtext/richtextxml.h"
#include "wx/richtext/richtexthtml.h"
#include "wx/richtext/richtextformatdlg.h"
#include "wx/richtext/richtextsymboldlg.h"
#include "wx/richtext/richtextstyledlg.h"
#include "wx/richtext/richtextprint.h"
#include "wx/richtext/richtextimagedlg.h"

#include "singleton.h"
#include "log4z.h"
#include "luabridge/lua-5.4.7/lua.hpp"
#include "luabridge/LuaBridge.h"

using namespace zsummer::log4z;

#define IDD_APPLICTION_NAME              "信号模拟器"
#define IDD_MENU_SIGNALSERVER_SET        1000             // 信号服务器设置

#define IDD_NETWORK_MSG_HEART                    1001            // 心跳消息
#define IDD_NETWORK_MSG_SIGNAL_COLLECT           1002            // 信号采集消息
#define IDD_NETWORK_MSG_SIGNAL_CONTROL           1003            // 信号控制消息
#define IDD_NETWORK_MSG_SIGNAL_CONTROLRETURN     1004            // 信号控制回复消息

#define IDD_MOUNTPOINT_WIDTH   20                     // 挂接点的显示宽度
#define IDD_MOUNTPOINT_HEIGHT  20                     // 挂接点的显示高度
#define IDD_SIGNALLAMP_RADIUS  10                     // 信号灯显示半径
#define IDD_SWITCHRECT_SIZE    20                     // 信号灯显示高宽

wxDEFINE_EVENT(DRAPLIST_SELECTED_EVENT, wxThreadEvent);

// 对齐选项（仅左右）
enum class TextAlignment {
    LEFT,    // 文本在 pos 的左侧(向左延伸)
    RIGHT,   // 文本在 pos 的右侧(向右延伸)
    CENTER
};

// 信号灯选排进路类型
enum SLRouteType
{
    ROUTE_LEFT = 0,         // 带左边轨道
    ROUTE_RIGHT,            // 带右边轨道
    ROUTE_NULL              // 两边都不带
};

struct tagSwitchRoute
{
    tagSwitchRoute(){}
    tagSwitchRoute(wxString sp,wxString ep)
        : startPos(sp),endPos(ep) {}

    wxString startPos;
    wxString endPos;
};

#pragma pack(push,1)
struct tagMsgHearder
{
    tagMsgHearder()
        :srcLength(0),compLength(0),checknum(0),msgType(0) {}

    char mark[3];         // 'S','I','G'
    uint16_t checknum;    // 校验码
    int srcLength;        // 原始长度
    int compLength;       // 压缩后长度
    int msgType;          // 消息类型
};
#pragma pack(pop)

struct tagTimerItem
{
    tagTimerItem()
        : runCount(0),interval(1),starttime(0) {}
    tagTimerItem(wxString pname,int pruncount,int pinterval,
                 luabridge::LuaRef pcallback)
        : name(pname),runCount(pruncount),interval(pinterval),
          callback(std::make_shared<luabridge::LuaRef>(pcallback)),
          starttime(0) {}

    wxString name;        // 定时器名称
    int runCount;         // 执行次数：0-无限
    int interval;         // 时间间隔，以秒为单位
    int starttime;        // 开始时间
    std::shared_ptr<luabridge::LuaRef> callback;  // 回调函数
};

wxMemoryBuffer CompressWithFastLZ(const void* data, size_t dataLen);
wxMemoryBuffer DecompressWithFastLZ(const void* compressedData, size_t compressedLen, size_t originalLen);
/// 得到指定目录下所有的文件路径
bool ListFilesInDirectory(const wxString& dirPath,wxVector<wxString>& decPaths);
/// 读取指定的文件到内存中
bool ReadFileToMemoryBuffer(const wxString& filePath, wxMemoryBuffer& buffer);
// 递归删除目录下的所有文件和子目录
bool DeleteDirectoryRecursive(const wxString& dirPath);
// 删除指定目录下的所有文件（不递归删除子目录）
bool DeleteAllFilesInDir(const wxString& dirPath,std::vector<wxString> files=std::vector<wxString>());
// 计算两点角度（0°~360°，以 P1 为原点，P2 为终点）
double CalculateAngle(const wxPoint& p1, const wxPoint& p2);
wxArrayString SplitString(const wxString& s, const wxString& delimiter);
wxString GB2312ToUTF8(const wxString& gb2312Text);
wxString UTF8ToGB2312(const wxString& utf8Text);
wxUint16 qChecksum(const char* data, size_t len);
void RemoveDataFromMemoryBuffer(wxMemoryBuffer& buffer,size_t pos, size_t len);

#endif // COMMON_H
